package com.example.leetcode.trainingcamp.week2.practice;

import java.util.ArrayList;
import java.util.List;

/**
 * 给你一个链表，每 k 个节点一组进行翻转，请你返回翻转后的链表。
 *
 * <p>k 是一个正整数，它的值小于或等于链表的长度。
 *
 * <p>如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
 *
 * <p>进阶：
 *
 * <p>你可以设计一个只使用常数额外空间的算法来解决此问题吗？ 你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/reverse-nodes-in-k-group
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test25 {

    ListNode newHead = new ListNode();
    ListNode tail = newHead;

    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null){
            return null;
        }
        ListNode pre = head;
        List<ListNode> list = new ArrayList<>();
        while (pre != null){
            list.add(pre);
            pre = pre.next;
        }
        int size = list.size();
        if (size<k || k == 1){
            return head;
        }
        int number = size / k; // 记录需要翻转的次数
        int count = 0;
        while (count<number){
            for (int i = k-1 + count * k;i>k-1 +(count-1) * k;i--){
                insert(list.get(i));
            }
            count++;
        }
        for (int i = number * k;i<size;i++){
            insert(list.get(i));
        }
        tail.next = null; // 一定要把最后一个节点置为null，否则当链表的长度和k相等时候（就成了反转链表）形成死循环例如 1->2 k=2 因为反转后 2->1
        // 如果不把1节点的next设置成空，next指针重新指向2，形成死循环
        return newHead.next;
    }
    public void insert(ListNode node){
        tail.next = node;
        tail = node;
    }
}


class Demo25{
  public static void main(String[] args) {
    ListNode head = new ListNode(1);
    head.next = new ListNode(2);
    head.next.next = new ListNode(3);
    head.next.next.next = new ListNode(4);
    head.next.next.next.next = new ListNode(5);
    head.next.next.next.next.next = new ListNode(6);
    head.next.next.next.next.next.next = new ListNode(7);
    Test25 t = new Test25();
    ListNode node = t.reverseKGroup(head, 2);
    while (node != null){
      System.out.println("val ="+node.val);
      node = node.next;
    }
  }
}